package main.leetcode.clockin.May;

import main.datastruc.TreeNode;

import java.util.ArrayList;
import java.util.List;

/**
 * 102.层序遍历
 *
 * <p>给你一个二叉树，请你返回其按 层序遍历 得到的节点值。 （即逐层地，从左到右访问所有节点）。
 *
 * <p>
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/binary-tree-level-order-traversal
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day13 {
    public static void main(String[] args) {
        TreeNode root = TreeNode.creCmpBTree(new int[] {3, 9, 20, 1, 4, 15, 7});
        System.out.println(new day13().levelOrder(root));
    }

    public List<List<Integer>> levelOrder(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        List<List<Integer>> res = new ArrayList<>();
        helper(res, root, 0);
        return res;
    }

    private void helper(List<List<Integer>> res, TreeNode root, int i) {
        if (root == null) {
            return;
        }

        // res的大小与当前节点所在层数相同，说明这层还没被遍历，为其创建一个新的list
        if (res.size() == i) {
            res.add(new ArrayList<>());
        }
        // 获取对应层数的list，加入当前值
        res.get(i).add(root.val);
        helper(res, root.left, i + 1);
        helper(res, root.right, i + 1);
    }

    //    public List<List<Integer>> levelOrder(TreeNode root) {
    //        if (root == null) {
    //            return new ArrayList<>();
    //        }
    //        Queue<TreeNode> queue = new LinkedList<>();
    //        queue.add(root);
    //        List<List<Integer>> res = new ArrayList<>();
    //        helper(queue, res);
    //        return res;
    //    }
    //
    //    private void helper(Queue<TreeNode> queue, List<List<Integer>> res) {
    //        if (queue.isEmpty()) {
    //            return;
    //        }
    //        List<Integer> list = new ArrayList<>();
    //        Queue<TreeNode> tmp = new LinkedList<>();
    //        TreeNode node;
    //        while (!queue.isEmpty()) {
    //            node = queue.poll();
    //            list.add(node.val);
    //            if (node.left != null) {
    //                tmp.add(node.left);
    //            }
    //            if (node.right != null) {
    //                tmp.add(node.right);
    //            }
    //        }
    //        res.add(list);
    //        helper(tmp, res);
    //    }
}
